我有一个包含属性的对象的文件process.env:
process.env
env.js
console.log('LOADING env.js'); const { PROXY_PREFIX = '/api/', USE_PROXY = 'true', APP_PORT = '8080', API_URL = 'https://api.address.com/', NODE_ENV = 'production', } = process.env; const ENV = { PROXY_PREFIX, USE_PROXY, APP_PORT, API_URL, NODE_ENV, }; module.exports.ENV = ENV;
现在我尝试用不同的process.env属性测试这个文件:
env.test.js
const envFilePath = '../../config/env'; describe('environmental variables', () => { const OLD_ENV = process.env; beforeEach(() => { process.env = { ...OLD_ENV }; delete process.env.NODE_ENV; }); afterEach(() => { process.env = OLD_ENV; }); test('have default values', () => { const { ENV } = require(envFilePath); expect(ENV).toMatchSnapshot(); }); test('are string values (to avoid casting errors)', () => { const { ENV } = require(envFilePath); Object.values(ENV).forEach(val => expect(typeof val).toEqual('string')); }); test('will receive process.env variables', () => { process.env.NODE_ENV = 'dev'; process.env.PROXY_PREFIX = '/new-prefix/'; process.env.API_URL = 'https://new-api.com/'; process.env.APP_PORT = '7080'; process.env.USE_PROXY = 'false'; const { ENV } = require(envFilePath); expect(ENV.NODE_ENV).toEqual('dev'); expect(ENV.PROXY_PREFIX).toEqual('/new-prefix/'); expect(ENV.API_URL).toEqual('https://new-api.com/'); expect(ENV.APP_PORT).toEqual('7080'); expect(ENV.USE_PROXY).toEqual('false'); }); });
不幸的是,即使我尝试在每个测试中分别加载文件,文件也只加载一次,使第三个测试失败:
js Expected value to equal: "dev" Received: "production"
PS当我单独运行测试时它不会失败。
我也知道env.js只加载一次,因为console.log('LOADING env.js');只被触发一次。
console.log('LOADING env.js');
我试图使节点缓存无效,例如:
beforeEach(() => { delete require.cache[require.resolve(envFilePath)]; process.env = { ...OLD_ENV }; delete process.env.NODE_ENV; });
但在每次测试之前require.cache都是空的{},所以似乎Jest以某种方式负责导入文件。
require.cache
{}
我也试图跑yarn jest --no-cache,但没有帮助。
yarn jest --no-cache
所以我想要的是在每次测试之前加载env.js,这样我就可以测试它在不同节点环境变量下的表现。
开玩笑@^22.0.4
您可以使用jest.resetModules()inbeforeEach方法重置已经需要的模块
jest.resetModules()
beforeEach
beforeEach(() => { jest.resetModules() process.env = { ...OLD_ENV }; delete process.env.NODE_ENV; });